Do not communicate by sharing memory; instead, share memory by communicating.
基本语法
不同类型
1 | ch := make(<-chan int) // 只读 |
发送
1 | ch <- v |
接收
1 | data := <- ch // 阻塞式 |
关闭
1 | close(ch) |
buffered vs non-buffered
non-buffered
1 | ch1 := make(chan int) |
buffered
1 | ch2 := make(chan int, 1) |
应用
简单同步
1 | func main() { |
select
语法类似于switch,但功能与select/poll/epoll类似
任意case
1 | ch1 := make(chan int, 1) |
简单超时
1 | to := make(chan bool, 1) |
buffer池
1 | ch := make(chan int, 1) |
应用场景:
- 有一个服务,当请求进来的时候我们会生成一个job扔进channel,由其他协程从channel中获取job去执行。
- 但当channel满时,将该job抛弃并回复【服务繁忙,请稍后再试】,或是将该job放入任务队列。
timer channel: Timer/Ticker
timer
时间到了就通道返回。
1 | timer := time.NewTimer(time.Second*2) |
ticker
与timer类似,但会重复进行。
1 | ticker := time.NewTicker(time.Millisecond * 500) // 每半秒一次计时 |